import time
import tkinter as tk

from tkinter import Label, ttk, font
import threading

from PIL import Image, ImageTk

from 运维工具.登录逻辑.调用入口 import getERresult


class Check(tk.Frame):
    def __init__(self, title=None, master=None, **kwargs):
        self.master = master
        self.datas = kwargs.pop('datas', {})  # 使用空字典作为默认值
        self.resp=kwargs.pop('resp',{})
        self.img_dir = kwargs.pop('img_dir', None)

        if self.img_dir:  # 确保img_dir存在再设置图标
            master.iconbitmap(f'{self.img_dir}/logo.ico')

        super().__init__(master, **kwargs)

        # 设置窗口大小
        window_width = kwargs.get('width', 400)
        window_height = kwargs.get('height', 300)

        # 获取屏幕尺寸以计算窗口居中位置
        screen_width = master.winfo_screenwidth()
        screen_height = master.winfo_screenheight()

        # 计算窗口居中的坐标
        x_coordinate = int((screen_width - window_width) / 2)
        y_coordinate = int((screen_height - window_height) / 2)

        # 设置窗口大小和位置
        self.master.geometry(f"{window_width}x{window_height}+{x_coordinate}+{y_coordinate}")
        self.master.title(title)
        self.master.resizable(False, False)

        # 设置Frame的背景色，与窗口背景一致
        self.configure(bg="white")
        self.pack(fill=tk.BOTH, expand=True)

        # 使用Pillow打开图片文件
        if self.img_dir:
            img_path = f'{self.img_dir}/人脸识别二维码.png'

            # 打开原始图片
            original_img = Image.open(img_path)
            original_width, original_height = original_img.size

            # 计算等比例缩放的尺寸
            ratio = min(window_width / original_width, window_height / original_height)
            new_width = int(original_width * ratio)
            new_height = int(original_height * ratio)

            # 等比例缩放图片
            img = original_img.resize((new_width - 100, new_height - 100), Image.LANCZOS)

            # 将Pillow图像对象转换为Tkinter可用的PhotoImage对象
            self.img_png = ImageTk.PhotoImage(img)

            # 直接在self上创建Label，不使用额外的容器
            label_img = Label(self, image=self.img_png, bg="white", bd=0)

            # 居中显示图片
            label_img.pack(anchor=tk.CENTER, ipady=0, ipadx=0, padx=0, pady=0, side=tk.TOP)
        # 创建样式对象
        style = ttk.Style()

        # 配置样式
        style.configure("Red.TLabel",
                        foreground="red",  # 设置文字颜色
                        font=("微软雅黑", 12),
                        background="white",  # 尝试空字符串
                        padding=(10, 5))
        # 添加状态标签，显示登录进度

        # 使用自定义字体
        self.status_label = ttk.Label(self, text="帅哥请扫码😀",style='Red.TLabel')

        self.status_label.pack(anchor='center', pady=10)

        # 在单独的线程中处理登录逻辑
        login_thread = threading.Thread(target=self.process_login)
        login_thread.daemon = True  # 设置为守护线程，这样主程序退出时线程也会结束
        login_thread.start()

    def process_login(self):
        """处理登录逻辑，在单独线程中执行"""
        print("处理登录，当前数据：")
        print(self.datas)

        if self.datas:  # 确保datas不为空
            try:
                for i in range(60):
                    time.sleep(2)

                    sign_on_result = getERresult(**self.datas)


                    # print(sign_on_result)
                    if sign_on_result['states']==200:
                        print("登录结果:", sign_on_result)
                        self.resp.set(f'{sign_on_result}')
                        # 使用after方法在主线程中更新UI
                        self.master.after(0, self.update_ui, sign_on_result)

                        break
            except Exception as e :
                print(f"登录过程出错: {e}")
                # 在主线程中更新UI显示错误
                self.master.after(0, self.show_error, str(e))
            # except:print(Exception)
        else:
            print("没有提供登录数据")
            # 在主线程中更新UI
            self.master.after(0, self.show_error, "没有提供登录数据")

    def update_ui(self, result):
        """在主线程中更新UI"""
        if result:
            self.status_label.config(text="登录成功!")
            # 可以在这里添加后续逻辑，如关闭窗口或跳转到主界面
            self.master.after(1000, self.master.destroy)  # 1秒后关闭窗口

        else:
            self.status_label.config(text="登录失败，请重启再登录")

    def show_error(self, error_msg):
        """显示错误信息"""
        self.status_label.config(text=f"错误: {error_msg}")
